﻿using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using WorkflowCore.Interface;
using WorkflowCore.Services.DefinitionStorage;

namespace WorkFlowCoreDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //创建WorkflowHost，注册并运行工作流
            IServiceProvider serviceProvider = ConfigureServices();
            //首先需要获取WorkflowHost的实例
            //使用serviceProvider.GetService<IWorkflowHost()获得的是相同的对象
            var host = serviceProvider.GetService<IWorkflowHost>();
            //异常处理
            host.OnStepError += Host_OnStepError;
            //然后注册工作流 ，这里可以注册多个工作流
            host.RegisterWorkflow<HelloWorldWorkflow, MyNameClass>();
            //json 加载
            //var loader = serviceProvider.GetService<IDefinitionLoader>();
            //var json = System.IO.File.ReadAllText("myflow.json");
            //loader.LoadDefinition(json, Deserializers.Json);
            //接下来，启动host
            host.Start();
            //然后可以启动工作流，这里可以启动多个工作流实例
            //每个流程是一个独立的线程，并行执行。
            var initialData = new MyNameClass{ MyName = "张三" , MyNames=new List<string>(){ "李四", "王五", "赵六" } };
            Console.WriteLine("请输入需要恢复的流程编号，如执行新流程直接回车：");
            string workflowId = Console.ReadLine();
            if (string.IsNullOrEmpty(workflowId))
            {
                //开始流程
                workflowId = host.StartWorkflow("HelloWorld", 1, initialData).Result;
                Console.WriteLine(workflowId);
            }
            else
            {
                //恢复过程
                host.ResumeWorkflow(workflowId);               
            }
            var activity = host.GetPendingActivity("activity-1", "worker1", TimeSpan.FromMinutes(1)).Result;

            //if (activity != null)
            //{
            //    Console.WriteLine("activity-1输入名字");
            //    string value = Console.ReadLine();
            //    host.SubmitActivitySuccess(activity.Token, value);
            //}
            //activity = host.GetPendingActivity("activity-2", "worker2", TimeSpan.FromMinutes(1)).Result;
            while (activity != null)
            {
                Console.WriteLine("输入大于3个字符的名字结束，小于3个字符的名字继续");
                string value = Console.ReadLine();
                host.SubmitActivitySuccess(activity.Token, value);
                activity = host.GetPendingActivity("activity-1", "worker1", TimeSpan.FromMinutes(1)).Result;
            }
            //var workflowId  =host.StartWorkflow("HelloWorld", 1, initialData).Result;
            //Console.WriteLine("输入名字");
            //string value = Console.ReadLine();
            //host.PublishEvent("MyEvent", workflowId, value);

            Console.ReadLine();
            //foreach (var key in initialData.Keys)
            //{
            //    Console.WriteLine(key + ":" + initialData[key]);
            //}
            //Console.ReadLine();
            //最后，关闭host
            //调用host.Stop立即终止正在执行的流程 host.Stop()终止了所有流程
            host.Stop();
        }
        private static IServiceProvider ConfigureServices()
        {
            //setup dependency injection
            IServiceCollection services = new ServiceCollection();
            services.AddLogging();
            //services.AddWorkflow();
            //WorkflowCore提供了几乎针对流行数据库的各种持久化方式，支持SqlServer、Sqlite等关系数据库，
            //也支持MongoDb、Redis等非关系数据库。缺省使用的是在内存中保存流程数据，但在实际应用中，
            //必须将流程数据持久化以保证系统的可靠性。当系统因为计划内或者意外原因出现异常后，
            //正在执行的流程应该能够在断点处恢复并继续执行。我们改造一下第一部分的例子，增加持久化设置，
            //并模拟流程中断和恢复过程。
            //首先，我们需要使用NuGet引入SqlServer持久化Provider：WorkflowCore.Persistence.SqlServer，
            //当然也可以使用其它类型的数据存储。
            //然后，修改ConfigureServices，将services.AddWorkflow(）修改为：
            services.AddWorkflow(x => x.UseSqlServer(@"Server=.;Database=WorkflowCore;uid=sa;password=xyg12345;", true, true));
            //这是新增加的服务
            services.AddWorkflowDSL();
            var serviceProvider = services.BuildServiceProvider();

            return serviceProvider;
        }
        private static void Host_OnStepError(WorkflowCore.Models.WorkflowInstance workflow, WorkflowCore.Models.WorkflowStep step, Exception exception)
        {

        }
    }
}
